package com.yunyao.dao.service.act.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yunyao.dao.mapper.ActHiActinstMapper;
import com.yunyao.dao.model.ActHiActinst;
import com.yunyao.dao.service.act.IActHiActinstService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author xingjishuai
 * @since 2024-07-02
 */
@Service
public class ActHiActinstServiceImpl extends ServiceImpl<ActHiActinstMapper, ActHiActinst> implements IActHiActinstService {

    /**
     * 根据流程实例ID查询流程历史活动实例列表
     * 该方法主要关注于特定流程实例的历史活动节点信息，包括用户任务和序列流两类
     *
     * @param processInstanceId 流程实例ID，用于筛选特定流程的历史活动实例
     * @return 返回与指定流程实例ID匹配的历史活动实例列表如果输入的流程实例ID为空或无效，
     *         则返回一个空列表
     */
    @Override
    public List<ActHiActinst> listByProcessInstanceId(String processInstanceId) {
        // 检查流程实例ID是否为空或无效，如果是，则直接返回空列表
        if (StringUtils.isBlank(processInstanceId)) {
            return List.of();
        }

        // 创建一个LambdaQueryWrapper对象用于构建查询条件
        LambdaQueryWrapper<ActHiActinst> wrapper = new LambdaQueryWrapper<>();
        // 添加条件，要求流程实例ID必须匹配输入的processInstanceId
        wrapper.eq(ActHiActinst::getProcInstId, processInstanceId);
        // 添加条件，活动类型必须是"sequenceFlow"或"userTask"之一
        wrapper.in(ActHiActinst::getActType, List.of("sequenceFlow", "userTask"));
        // 设置按活动开始时间降序排序
        wrapper.orderByDesc(ActHiActinst::getStartTime);

        // 执行查询并返回结果列表
        return list(wrapper);
    }

    /**
     * 根据流程实例ID、活动ID和类型查询历史活动实例
     *
     * @param processInstanceId 流程实例ID
     * @param actId 活动ID
     * @param type 活动类型
     * @return 返回符合条件的历史活动实例，如果不存在则返回null
     */
    @Override
    public ActHiActinst getByProcessInstanceIdAndActIdAndType(String processInstanceId,
                                                              String actId,
                                                              String type) {
        // 检查流程实例ID是否为空，如果为空则直接返回null，避免执行后续查询操作
        if (StringUtils.isBlank(processInstanceId)) {
            return null;
        }
        // 构建查询条件
        LambdaQueryWrapper<ActHiActinst> wrapper = new LambdaQueryWrapper<>();
        // 根据流程实例ID、活动ID和类型进行精确匹配
        wrapper.eq(ActHiActinst::getProcInstId, processInstanceId);
        wrapper.eq(ActHiActinst::getActId, actId);
        wrapper.eq(ActHiActinst::getActType, type);
        // 按照开始时间降序排序，以获取最新的记录
        wrapper.orderByDesc(ActHiActinst::getStartTime);
        // 执行查询并返回结果，如果没有找到匹配的记录，将返回null
        return getOne(wrapper);
    }

    /**
     * 根据流程实例ID和类型查询历史活动实例
     *
     * @param processInstanceId 流程实例ID
     * @param type 活动类型
     * @return 符合条件的历史活动实例，如果不存在则返回null
     */
    @Override
    public ActHiActinst getByProcessInstanceIdAndType(String processInstanceId, String type) {
        // 检查流程实例ID是否为空，为空则直接返回null
        if (StringUtils.isBlank(processInstanceId)) {
            return null;
        }
        // 构建查询条件
        LambdaQueryWrapper<ActHiActinst> wrapper = new LambdaQueryWrapper<>();
        // 根据流程实例ID筛选
        wrapper.eq(ActHiActinst::getProcInstId, processInstanceId);
        // 根据活动类型筛选
        wrapper.eq(ActHiActinst::getActType, type);
        // 按照开始时间降序排序
        wrapper.orderByDesc(ActHiActinst::getStartTime);
        // 执行查询并返回结果
        return getOne(wrapper);
    }

    /**
     * 根据流程实例ID列表查询流程活动历史信息列表
     *
     * @param processInstanceIdList 流程实例ID列表
     * @return 流程活动历史信息列表
     */
    @Override
    public List<ActHiActinst> listByProcessInstanceIdList(List<String> processInstanceIdList) {
        // 判断流程实例ID列表是否为空，如果为空则直接返回空列表
        if (CollectionUtils.isEmpty(processInstanceIdList)) {
            return List.of();
        }
        // 创建查询条件封装对象
        LambdaQueryWrapper<ActHiActinst> wrapper = new LambdaQueryWrapper<>();
        // 设置查询条件，根据流程实例ID列表进行查询
        wrapper.in(ActHiActinst::getProcInstId, processInstanceIdList);
        // 设置排序条件，按照活动开始时间升序排列
        wrapper.orderByAsc(ActHiActinst::getStartTime);
        // 执行查询并返回结果
        return list(wrapper);
    }

    @Override
    public List<ActHiActinst> listByProcessInstanceIdListAndType(List<String> processInstanceIdList, String type) {
        if (CollectionUtils.isEmpty(processInstanceIdList)) {
            return List.of();
        }
        LambdaQueryWrapper<ActHiActinst> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(ActHiActinst::getProcInstId, processInstanceIdList);
        wrapper.eq(ActHiActinst::getActType, type);
        return list(wrapper);
    }
}
